home *** CD-ROM | disk | FTP | other *** search
/ Amiga Plus Special 23 / AMIGAplus Sonderheft 23 (2000)(Falke)(DE)[!].iso / Updates / Datatypes / PCD-DT35 / Source / libbase.c < prev    next >
C/C++ Source or Header  |  1999-11-14  |  3KB  |  185 lines

  1. #include <clib/alib_protos.h>
  2. #include <pragma/exec_lib.h>
  3. #include <pragma/intuition_lib.h>
  4. #include <dos/dos.h>
  5. #include <exec/resident.h>
  6.  
  7. #define VERSION 44
  8. #define REVISION 0
  9.  
  10. struct ClassBase:Library
  11. {
  12. BPTR cb_SegList;
  13. IClass *cb_Class;
  14. SignalSemaphore cb_Lock;
  15. };
  16.  
  17. extern APTR Dispatcher;
  18. extern ULONG InitTab[];
  19. extern APTR LibVectors[];
  20. extern char LibName[];
  21. extern char LibId[];
  22.  
  23. Library *LibInit(register __a0 ULONG Segment,register __d0 ClassBase *cb,register __a6 Library *sysbase);
  24. Library *LibOpen(register __a6 ClassBase *cb);
  25. ULONG LibClose(register __a6 ClassBase *cb);
  26. ULONG LibExpunge(register __a6 ClassBase *cb);
  27. IClass *ObtainClass(register __a6 ClassBase *cb);
  28.  
  29. BOOL L_OpenLibs();
  30. void L_CloseLibs();
  31. IClass *InitClass(ClassBase *cb);
  32.  
  33. static LONG LibExtFunc()
  34. {
  35. return -1;
  36. }
  37.  
  38. static Resident RomTag=
  39. {
  40. RTC_MATCHWORD,
  41. &RomTag,
  42. &RomTag+sizeof(RomTag),
  43. RTF_AUTOINIT,
  44. VERSION,
  45. NT_LIBRARY,
  46. 0,
  47. LibName,
  48. LibId,
  49. &InitTab
  50. };
  51.  
  52. char LibName[]="pcd.datatype";
  53. char LibId[]="$VER:pcd.datatype 44.0 (13.11.99) © 1997-99 by Achim Stegemann\n";
  54.  
  55. ULONG InitTab[]=
  56. {
  57. sizeof(ClassBase),
  58. ULONG(LibVectors),
  59. 0,
  60. ULONG(LibInit)
  61. };
  62.  
  63. APTR LibVectors[]=
  64. {
  65. LibOpen,
  66. LibClose,
  67. LibExpunge,
  68. LibExtFunc,
  69. ObtainClass,
  70. APTR(-1),
  71. };
  72.  
  73. Library *SysBase;
  74. Library *DOSBase;
  75. Library *IntuitionBase;
  76. Library *GfxBase;
  77. Library *UtilityBase;
  78. Library *DataTypesBase;
  79. Library *SuperClassBase;
  80.  
  81. Library *LibInit(register __a0 ULONG Segment,register __d0 ClassBase *cb,register __a6 Library *sysbase)
  82. {
  83. SysBase=sysbase;
  84. cb->lib_Revision=REVISION;
  85. cb->cb_SegList=Segment;
  86. InitSemaphore(&cb->cb_Lock);
  87. return cb;
  88. }
  89.  
  90. Library *LibOpen(register __a6 ClassBase *cb)
  91. {
  92. Library *ret=0;
  93. cb->lib_Flags&=~LIBF_DELEXP;
  94. ObtainSemaphore(&cb->cb_Lock);
  95. if(!cb->cb_Class)
  96.     {
  97.     if(L_OpenLibs())
  98.         {
  99.         if(cb->cb_Class=InitClass(cb)) ret=cb;
  100.         }
  101.     }
  102. else ret=cb;
  103. if(ret) cb->lib_OpenCnt++;
  104. ReleaseSemaphore(&cb->cb_Lock);
  105. return ret;
  106. }
  107.  
  108. ULONG LibClose(register __a6 ClassBase *cb)
  109. {
  110. if(cb->lib_OpenCnt) cb->lib_OpenCnt--;
  111. return (!cb->lib_OpenCnt&&cb->lib_Flags&LIBF_DELEXP)?LibExpunge(cb):0;
  112. }
  113.  
  114. ULONG LibExpunge(register __a6 ClassBase *cb)
  115. {
  116. if(!cb->lib_OpenCnt)
  117.     {
  118.     if(cb->cb_Class) 
  119.         {
  120.         if(!FreeClass(cb->cb_Class))
  121.             {
  122.             AddClass(cb->cb_Class);
  123.             return 0;
  124.             }
  125.         }
  126.     L_CloseLibs();
  127.     Remove(cb);
  128.     FreeMem((BYTE *)cb-cb->lib_NegSize,cb->lib_NegSize+cb->lib_PosSize);
  129.     return cb->cb_SegList;
  130.     }
  131. else cb->lib_Flags|=LIBF_DELEXP;
  132. return 0;
  133. }
  134.  
  135. BOOL L_OpenLibs()
  136. {
  137. if(DOSBase=OpenLibrary("dos.library",40))
  138.     {
  139.     if(GfxBase=OpenLibrary("graphics.library",40))
  140.         {
  141.         if(IntuitionBase=OpenLibrary("intuition.library",40))
  142.             {
  143.             if(UtilityBase=OpenLibrary("utility.library",40))
  144.                 {
  145.                 if(DataTypesBase=OpenLibrary("datatypes.library",44))
  146.                     {
  147.                     if(SuperClassBase=OpenLibrary("datatypes/picture.datatype",44)) return 1;
  148.                     }
  149.                 }
  150.             }
  151.         }
  152.     }
  153. L_CloseLibs();
  154. return 0;
  155. }
  156.  
  157. void L_CloseLibs()
  158. {
  159. CloseLibrary(DOSBase);
  160. CloseLibrary(IntuitionBase);
  161. CloseLibrary(GfxBase);
  162. CloseLibrary(UtilityBase);
  163. CloseLibrary(DataTypesBase);
  164. CloseLibrary(SuperClassBase);
  165. }
  166.  
  167. IClass *InitClass(ClassBase *cb)
  168. {
  169. IClass *cl;
  170. if(cl=MakeClass(LibName,"picture.datatype",0,0,0))
  171.     {
  172.     cl->h_Entry=&HookEntry;
  173.     cl->h_SubEntry=&Dispatcher;
  174.     cl->cl_UserData=ULONG(cb);
  175.     AddClass(cl);
  176.     }
  177. return cl;
  178. }
  179.  
  180. IClass *ObtainClass(register __a6 ClassBase *cb)
  181. {
  182. return cb->cb_Class;
  183. }
  184.  
  185.